package org.rainbowinverted.charging.device.api.operation;

import org.rainbowinverted.charging.device.api.operation.dto.DeviceReqDTO;
import org.rainbowinverted.charging.device.api.operation.dto.DeviceRespDTO;
import org.rainbowinverted.charging.device.api.operation.dto.op.*;
import org.rainbowinverted.charging.device.api.operation.dto.resp.DeviceRespChargeControlDTO;
import org.rainbowinverted.charging.device.api.operation.dto.resp.DeviceRespStatusInfoDTO;
import org.rainbowinverted.charging.device.api.operation.dto.resp.gun.GunInfo;

/**
 * @author huaiping
 */
public interface DeviceOperationService {
    /**
     * 启动充电
     *
     * @param controlDTO 控制dto
     * @return {@link DeviceRespDTO}<{@link DeviceRespChargeControlDTO}>
     */
    DeviceRespDTO<DeviceRespChargeControlDTO> startCharge(DeviceReqDTO<DeviceOpChargeControlDTO> controlDTO);

    /**
     * 停止充电
     *
     * @param controlDTO 控制dto
     * @return {@link DeviceRespDTO}<{@link DeviceRespChargeControlDTO}>
     */
    DeviceRespDTO<DeviceRespChargeControlDTO> stopCharge(DeviceReqDTO<DeviceOpChargeControlDTO> controlDTO);

    /**
     * 获取在线状态
     *
     * @param deviceDTO 设备dto
     * @return {@link DeviceRespDTO}<{@link Boolean}>
     */
    DeviceRespDTO<Boolean> getOnlineStatus(DeviceReqDTO<Void> deviceDTO);

    /**
     * 获取设备状态信息
     *
     * @param deviceDTO 设备dto
     * @return {@link DeviceRespDTO}<{@link DeviceRespStatusInfoDTO}>
     */
    DeviceRespDTO<DeviceRespStatusInfoDTO> getDeviceStatusInfo(DeviceReqDTO<Void> deviceDTO);

    /**
     * 获取充电枪信息
     *
     * @param deviceQueryGunInfoDTO 设备查询枪信息dto
     * @return {@link DeviceRespDTO}<{@link GunInfo}>
     */
    DeviceRespDTO<GunInfo> getGunInfo(DeviceReqDTO<DeviceOpQueryGunInfoDTO> deviceQueryGunInfoDTO);

    /**
     * 更新二维码
     *
     * @param qrUpdateDTO qr更新dto
     * @return {@link DeviceRespDTO}<{@link Boolean}>
     */
    DeviceRespDTO<Boolean> updateQrCode(DeviceReqDTO<DeviceOpQrUpdateDTO> qrUpdateDTO);

    /**
     * 重新启动
     *
     * @param rebootDTO 重新启动dto
     * @return {@link DeviceRespDTO}<{@link Boolean}>
     */
    DeviceRespDTO<Boolean> reboot(DeviceReqDTO<DeviceOpRebootDTO> rebootDTO);

    /**
     * 执行命令
     *
     * @param executeCmdDTO 执行命令
     * @return {@link DeviceReqDTO}<{@link Boolean}>
     */
    DeviceReqDTO<Boolean> executeCmd(DeviceReqDTO<DeviceOpExecuteCmdDTO> executeCmdDTO);
}
